package com.xuyuan.ai.vector;

import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

/**
 * TODO 使用Redis作向量库还要安装Redisearch，使用ES 作向量库
 *
 * @author xuyuan
 * 在向量数据库中，查询与传统的关系数据库不同。它们执行相似性搜索，而不是精确匹配。当给定一个向量作为查询时，向量数据库会返回与查询向量“相似”的向量。向量数据库用于将您的数据与 AI 模型集成。
 * 使用它们的第一步是将您的数据加载到向量数据库中。然后，当要将用户查询发送到 AI 模型时，首先检索一组类似的文档。然后，这些文档作为用户问题的上下文，并与用户的查询一起发送到 AI 模型。这种技术称为检索增强生成 (RAG)。
 */
@RestController
public class VectorStoreController implements InitializingBean, ApplicationContextAware {

    @Autowired
    private VectorStore vectorStore;
    private ApplicationContext context;

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("VectorStoreController afterPropertiesSet");

    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
    }

    @GetMapping("/ai/vectorstore")
    public void vectorstore() {
        List<Document> documents = List.of(
                new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
                new Document("The World is Big and Salvation Lurks Around the Corner"),
                new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));

        // Add the documents to Elasticsearch
        vectorStore.add(documents);

        // Retrieve documents similar to a query
        List<Document> results = this.vectorStore.similaritySearch(SearchRequest.builder().query("Spring").topK(5).build());
    }
}
